/************************************
 文件明 ：  bsp_exit.h
 作者   ：  胡秋峰
 描述   ：  外部中断驱动
 ************************************/

#include "bsp_exit.h"
#include "bsp_gpio.h"
#include "bsp_int.h"
#include "bsp_delay.h"
#include "bsp_beep.h"

/**
 * @描述    ： 初始化外部中断
 * @参数    ： 无
 * @返回值  ： 无 
 */
void exit_init(void)
{
    gpio_pin_config_t key_config;

    /* 1、设置IO复用 */
    IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0);
    IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0XF080);
    
    /* 2、初始化GPIO为中断模式 */
    key_config.direction = kGPIO_DigitalInput;
    key_config.mode = kGPIO_IntFallingEdge;
    key_config.outputLogic = 1;
    gpio_init(GPIO1, 18, &key_config);

    /* 3、使能GIC中断、注册中断服务函数、使能GPIO中断 */
    GIC_EnableIRQ(GPIO1_Combined_16_31_IRQn);
    system_register_irq_handler(GPIO1_Combined_16_31_IRQn,
                        (system_irq_handler_t)gpio1_io18_irq_handler,
                        NULL);
    gpio_int_enable(GPIO1, 18);
}

/**
 * @描述    ： GPIO1_IO18的中断处理函数
 * @参数    ： 无
 * @返回值  ： 无 
 */
void gpio1_io18_irq_handler(void)
{
    static uint8_t state = 0;
    /* 暂时采用延迟消抖方法，中断函数一般不建议使用延迟函数 */
    delay_ms(10);
    if (gpio_pin_read(GPIO1, 18) == 0) {
        state = !state;
        beep_switch(state);
    }
    gpio_clear_int_flags(GPIO1, 18);    /* 清除中断标志位 */
}

